package com.example.askto;

import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

/**
 * 自动寻仙
 */
public class Zdxx {

    /**
     * 当前八仙剩余队员次数
     */
    private int times = 0;

    /**
     * 该哪个八仙了 0:从太秒真君开始
     */
    private int currentBx = 0;

    /**
     * 需要刷的轮数
     */
    private int round = 10;

    /**
     * 当前八仙信息
     */
    private Bxxx currentBxxx;

    /**
     * 当前队长角色下标
     */
    private int currentNumber;

    /**
     * 是否是大号
     */
    private boolean isDh = true;

    public boolean isDh() {
        return isDh;
    }

    public void setDh(boolean dh) {
        isDh = dh;
    }

    public void setTimes(int times) {
        this.times = times;
    }

    public void setCurrentBx(int currentBx) {
        this.currentBx = currentBx;
    }

    public void setRound(int round) {
        this.round = round;
    }

    public void start() {
        //鼠标定位到游戏里面
        RobotUtil.mouseMove(604, 925);//  自动战斗的位置
        RobotUtil.alt_tab();
        RobotUtil.mouseLeft();

        // > 0 表示中途异常了，需要从中间开始
        if (currentBx > 0) {
            List<Bxxx> listSyBxxx = listSyBxxx();
            for (Bxxx bxxx : listSyBxxx) {
                this.goBxStart(bxxx);// 前往八仙进入战斗);
            }
        }

        // 正常进行的八仙
        List<Bxxx> listBxxx = this.listBxxx();
        for (int i = 0; i < round; i++) {
            // 到太秒真君领取任务
            this.goTmzjLrw();
            for (Bxxx bxxx : listBxxx) {
                this.goBxStart(bxxx);// 前往八仙进入战斗
            }
        }
    }

    /**
     * 前往居所
     */
    public void goJs() {
        RobotUtil.alt_f();
        RobotUtil.mouseMoveQh(888, 792); //夫妻居所的那个按钮
        RobotUtil.sleep500();
        RobotUtil.mouseLeft();
        RobotUtil.sleep100_200();
        RobotUtil.alt_f();
    }

    /**
     * 去太秒真君
     */
    public void goTmzj() {
        System.out.println("前往太妙真君处");
        this.goJs();

        RobotUtil.alt_w();
        RobotUtil.mouseMoveQh(822, 371); //  领取任务的坐标
        RobotUtil.sleep500();
        RobotUtil.mouseLeft();
        RobotUtil.sleepS(2);
        RobotUtil.F8();
        if(isDh){
            RobotUtil.sleepS(30);
        }else {
            RobotUtil.sleepS(40);
        }
        RobotUtil.F8();
    }

    /**
     * 太秒真君领取任务
     */
    public void goTmzjLrw() {
        System.out.println("前往太妙真君领取任务");
        this.goTmzj();

        RobotUtil.mouseMoveQh(425, 802); //  取消任务
        RobotUtil.mouseLeft();
        RobotUtil.sleep100_200();


//        RobotUtil.esc();
        RobotUtil.alt_w();
        RobotUtil.mouseMoveQh(822, 371); //  领取任务的坐标
        RobotUtil.sleep500();
        RobotUtil.mouseLeft();
        // 开始勾选
        RobotUtil.mouseMoveQh(394, 624);
        RobotUtil.mouseLeft();

        RobotUtil.mouseMoveQh(394, 595);
        RobotUtil.mouseLeft();

        RobotUtil.sleep100_200();
//        RobotUtil.esc();

        RobotUtil.mouseMoveQh(719, 650); //  点击取消
        RobotUtil.mouseLeft();
        RobotUtil.sleep100_200();

        RobotUtil.mouseMoveQh(394, 595);
        for (int i = 0; i < 4; i++) {
            RobotUtil.ctrl_tab();
            System.out.println("前往太妙真君领取任务：切换队员" + (i + 2));
            RobotUtil.mouseLeft();
            RobotUtil.sleep100_200();
            RobotUtil.mouseLeft();
            RobotUtil.sleep100_200();
        }
        RobotUtil.ctrl_tab();

    }

    /**
     * 前往至八仙
     */
    public void goBxStart(Bxxx bxxx) {
        this.currentBxxx = bxxx;
        System.out.println("开始前往" + bxxx.getName());

        if (this.times == 0) {
            this.currentNumber = 1;
            RobotUtil.alt_w();
            RobotUtil.mouseMoveQh(bxxx.getX(), bxxx.getY());
            RobotUtil.sleep500();
            RobotUtil.mouseLeft();
            if(bxxx.getIndex() !=7){
                RobotUtil.F8();
            }
            RobotUtil.sleep100_200();

            int distanceTime = bxxx.getDistanceTime();
            if (!isDh) {
                distanceTime = distanceTime + 10;
            }

            RobotUtil.sleepS(distanceTime); // 跑路s秒

            System.out.println("队长开始进去战斗");
            this.enterFight(); // 进入战斗时间
        }

        int size = 4;
        if (this.times > 0) {
            size = times;
            this.times = 0;// 将次数重置为0;，保证后续正常进行
        }
        for (int i = 0; i < size; i++) {
            this.changeLeader();// 切换队长
            this.currentNumber = (i + 2);

            RobotUtil.alt_w();
            RobotUtil.mouseMoveQh(bxxx.getX(), bxxx.getY());
            RobotUtil.sleep500();
            RobotUtil.sleep100_200();
            RobotUtil.mouseLeft();
            RobotUtil.sleep500();

            this.enterFight(); // 进入战斗时间
        }
        this.changeLeader();// 切换队长
    }

    /**
     * 添加自动战斗
     */
    public void addZdzd() {
        System.out.println("延续自动战斗");
        RobotUtil.mouseMoveQh(604, 925);//  自动战斗的位置
        for (int i = 0; i < 5; i++) {
            RobotUtil.mouseLeft();
            RobotUtil.ctrl_tab();
        }
    }

    /**
     * 切换队长/截图判断加强版
     */
    public void changeLeader() {
        RobotUtil.alt_t();

        RobotUtil.mouseMoveQh(1000, 500);
        System.out.println("定位到切换队长的位置");
//        RobotUtil.sleep800();
        RobotUtil.sleep100_200();
        // 截图判断
//        checkLeft();

        RobotUtil.mouseLeft();
        System.out.println("点击鼠标左键");
        RobotUtil.mouseLeft();
        System.out.println("点击鼠标左键");

        RobotUtil.mouseMoveQh(298, 900);
        System.out.println("定位到升为队长按钮上");
//        RobotUtil.sleep800();
        RobotUtil.sleep100_200();

        // 截图判断
//        checkLeft();

        System.out.println("点击鼠标左键两次");
        RobotUtil.mouseLeft();
        RobotUtil.mouseLeft();
        RobotUtil.sleep500();

        System.out.println("回车");
        RobotUtil.enter();
        RobotUtil.sleep500();
        RobotUtil.alt_t();
        RobotUtil.sleep500();
        RobotUtil.ctrl_tab();
        System.out.println("切换到队长");

        System.out.println("切换队长已完成！");
    }

    /**
     * 所有的八仙信息
     */
    private List<Bxxx> listBxxx() {
        List<Bxxx> listBxxx = new ArrayList<>();
        if(isDh){
            listBxxx.add(new Bxxx(1, 822, 398, 28, "汉钟离"));
            listBxxx.add(new Bxxx(2, 518, 374, 8, "蓝采和"));
            listBxxx.add(new Bxxx(3, 514, 400, 12, "韩湘子"));
            listBxxx.add(new Bxxx(4, 514, 424, 12, "张果老"));
            listBxxx.add(new Bxxx(5, 306, 666, 20, "曹国舅"));
            listBxxx.add(new Bxxx(6, 310, 694, 20, "吕动斌"));
            listBxxx.add(new Bxxx(7, 310, 722, 25, "和仙姑"));
            listBxxx.add(new Bxxx(8, 310, 750, 10, "铁拐李"));
        }else{
            listBxxx.add(new Bxxx(1, 822, 398, 42, "汉钟离"));
            listBxxx.add(new Bxxx(2, 518, 374, 20, "蓝采和"));
            listBxxx.add(new Bxxx(3, 514, 400, 15, "韩湘子"));
            listBxxx.add(new Bxxx(4, 514, 424, 35, "张果老"));
            listBxxx.add(new Bxxx(5, 306, 666, 30, "曹国舅"));
            listBxxx.add(new Bxxx(6, 310, 694, 20, "吕动斌"));
            listBxxx.add(new Bxxx(7, 310, 722, 25, "和仙姑"));
            listBxxx.add(new Bxxx(8, 310, 750, 15, "铁拐李"));
        }
        return listBxxx;
    }

    /**
     * 剩余的八仙信息
     */
    private List<Bxxx> listSyBxxx() {
        List<Bxxx> listSyBxxx = new ArrayList<>();
        List<Bxxx> listAllBxxx = this.listBxxx();

        for (Bxxx bxxx : listAllBxxx) {
            int index = bxxx.getIndex();

            if (index >= this.currentBx) {
                listSyBxxx.add(bxxx);
            }
        }

        return listSyBxxx;
    }

    /**
     * 进入战斗等待
     */
    public void enterFight() {
        // 队长 开始勾选
        RobotUtil.mouseMoveQh(394, 652); // 进入战斗的选项
        RobotUtil.sleep500();
        // 进入战斗前先截取一下战斗时宠物头像位置的数据。

        BufferedImage preFight = RobotUtil.screenShotTx();// 战斗前宠物位置图片
        // 选择进入战斗
        RobotUtil.mouseLeft();

        RobotUtil.sleep500(); // 等待5毫秒反应时间
        BufferedImage fighting = RobotUtil.screenShotTx();// 战斗时宠物位置图片


        // 等待时间
        int waitTime = 15;
        if(!isDh){
            waitTime = 30;
        }
        if (this.currentNumber == 1 && (!((this.currentBxxx.getIndex() & 1) == 1) || !isDh)) {
            // 偶数续自动战斗
            this.addZdzd();
            waitTime = 10;
        }
        // 进入战斗先截取一张宠物头像图片
        int s = 0;
        try {
            while (s < 120) {
                Thread.sleep(1000);
                s++;
                if (s > waitTime) {
                    BufferedImage newcwtx = RobotUtil.screenShotTx();// 战斗时宠物头像new
                    double similarity = ImageUtil.getSimilarity2Gray(fighting, newcwtx);

                    System.out.println(this.currentBxxx.getName() + ":战斗时间->" + s + "，相似度：" + similarity);
                    if (similarity < 0.5) {
                        Thread.sleep(1000);
                        newcwtx = RobotUtil.screenShotTx();// 战斗时宠物头像new
                        similarity = ImageUtil.getSimilarity2Gray(fighting, newcwtx);
                        // 相似度小于0.5，说明战斗已经结束，此时给s赋值50 提前终止循环
                        if (similarity < 0.5) {
                            s = 120;
                        }
                    }
                } else {
                    System.out.println(this.currentBxxx.getName() + ":战斗时间->" + s);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
